/**
 * @class Ext
 */
(function() {
    Ext.info = 'This is a ExtPlus JavaScript Library.';
    
    // 修改Ext.BLANK_IMAGE_URL引用本地图片
    if (Ext.isIE6 || Ext.isIE7 || Ext.isAir) {
        /**
         * @private
         * 重定义Ext.BLANK_IMAGE_URL指向到本地图片'resources/images/default/s.gif'
         * @property BLANK_IMAGE_URL
         * @type String
         */
        Ext.BLANK_IMAGE_URL = 'resources/images/default/s.gif';
    }
    
    Ext.apply(Ext, {
        /**
         * True浏览器为FireFox
         * @property isFF
         * @type Boolean
         */
        isFF: Ext.isGecko,

        /**
         * True浏览器为FireFox 2
         * @property isFF2
         * @type Boolean
         */
        isFF2: Ext.isGecko2,

        /**
         * True浏览器为FireFox 3
         * @property isFF3
         * @type Boolean
         */
        isFF3: Ext.isGecko3
    });
})();

/**
 * @class String
 */
Ext.applyIf(String.prototype, {
    /**
     * 去除字符串左侧空格
     * <pre><code>
var s = '  foo bar  ';
alert('-' + s + '-');         // alerts "- foo bar -"
alert('-' + s.trim() + '-');  // alerts "-foo bar -"
     * </code></pre>
     * @return {String} The trimmed string
     */
    lTrim: function() {
        return this.replace(/^\s+/, '');
    },

    /**
     * 去除字符串右侧空格
     * <pre><code>
var s = '  foo bar  ';
alert('-' + s + '-');         // alerts "- foo bar -"
alert('-' + s.trim() + '-');  // alerts "- foo bar-"
     * </code></pre>
     * @return {String} The trimmed string
     */
    rTrim: function() {
        return this.replace(/\s+$/, '');
    },

    /**
     * 计算中英混合字符串长度，一个汉字计算两个字符长度
     * <pre><code>
var s = 'fff发发';
alert(s.cnLength());  // 长度为7
     * </code></pre>
     * @return {Number} 字符串长度
     */
    cnLength: function() {
        var str = this.match(/[^ -~]/g);
        return str == null ? this.length : this.length + str.length;
    },

    /**
     * 计算中英混合字符串截取，一个汉字计算两个字符长度
     * <pre><code>
var s = 'fff发发';
alert(s.cnSubstring(1, 3));  // alerts "ff"
alert(s.cnSubstring(1, 4));  // alerts "ff发"
alert(s.cnSubstring(1, 5));  // alerts "ff发"
alert(s.cnSubstring(3, 6));  // alerts "发发"
alert(s.cnSubstring(3, 7));  // alerts "发发"
     * </code></pre>
     * @param {Number} start 开始位置
     * @param {Number} stop 截止位置
     * @return {String} 截取后的字符串
     */
    cnSubstring: function(start, stop) {
        var len = this.length, cnLen = this.cnLength(), s, e;
        if (len === cnLen) {
            return this.substring(start, stop);
        }
        var re = /[^ -~]/;
        var verify = function(s) {
            return re.test(s);
        };
        for (var i = 0, j = 0; i < len; i++, j++) {
            if (verify(this.substring(i, i + 1))) {
                j++;
            }
            if (!s && j >= start) {
                s = i;
            }
            if (s && !stop) {
                break;
            }
            if (stop && !e && j >= stop) {
                e = i;
                break;
            }
        }
        if (!stop) {
            return this.substring(s);
        }
        return this.substring(s, e);
    }
});
